from selenium import webdriver

# TODO 浏览器设置
# 设置无窗口
# chrome_options = webdriver.ChromeOptions()
'''
常见的浏览器参数还有:
启动就最大化:--start-maximized 
指定用户文件夹 User Data 路径，可以把书签这样的用户数据保存在系统分区以外的分区:–-user-data-dir=”[PATH]” 
指定缓存Cache路径:–-disk-cache-dir=”[PATH]“ 
指定Cache大小，单位Byte:-disk-cache-size=100 
隐身模式启动:–-incognito 
禁用Javascript:–-disable-javascript 
禁止加载所有插件，可以增加速度:--disable-plugins 
禁用JavaScript:--disable-javascript 
禁用弹出拦截:--disable-popup-blocking 
禁用插件:--disable-plugins 
禁用图像:--disable-images 
其他参数： https://peter.sh/experiments/chromium-command-line-switches/
'''
# chrome_options.add_argument('--headless')
# 声明浏览器对象
# driver = webdriver.Chrome()
# 访问页面
# driver.get("http://www.baidu.com")


# TODO 设置代理
# chrome_options.add_argument('--proxy-server=http://{ip}:{port}')

#  TODO 获取页面元素
from selenium.webdriver.common.by import By
# 声明浏览器对象
driver = webdriver.Chrome()
# 访问页面
driver.get("http://www.baidu.com")

# 通过id查找
# element = driver.find_element_by_id("kw")
# print(element.tag_name)
# 通过name查找
# element = driver.find_element_by_name("wd")
# print(element.tag_name)
# 通过xpath查找
# element = driver.find_element_by_xpath('//*[@id="kw"]')
# print(element.tag_name)
# 通过另一种方式查找
# element = driver.find_element(By.ID, "kw")
# print(element.tag_name)

#  TODO 获取多个元素

# 声明浏览器对象
# driver = webdriver.Chrome()
# # 访问页面
# driver.get("http://www.baidu.com")
#
# # 查找多个元素
# elements = driver.find_elements(By.CLASS_NAME, 'mnav')
# for e in elements:
#     print(e.text)

# TODO 页面操作
# 声明浏览器对象
driver = webdriver.Chrome()
# 访问页面
driver.get("http://www.baidu.com")

# 获取百度搜索框元素
# element = driver.find_element_by_id("kw")
# # 在搜索框中输入关键词selenium
# element.send_keys("selenium")
# # 点击"百度一下"按钮
# driver.find_element_by_xpath('//*[@id="su"]').click()
#
# from selenium.webdriver.common.keys import Keys
# import time
# time.sleep(5)

# 清空搜索框关键词
# element.clear()
# time.sleep(2)
# # 在搜索框中输入关键词python，并模拟键盘的enter操作
# element.send_keys("python", Keys.ENTER)
# # 4秒后关闭页面
# time.sleep(5)
# driver.close()

# TODO 等待加载
# 隐式等待
# from selenium import webdriver
# from selenium.webdriver.common.keys import Keys
# 声明浏览器对象
# driver = webdriver.Chrome()
# 设置隐式等待时间，单位为秒
'''
使用隐式等待时，如果 webdriver 没有找到指定的元素，将继续等待指定元素出现，直至超出设定时间，如果还是没有找到指定元素，
则抛出找不到元素的异常。默认等待时间为0。隐式等待是对整个页面进行等待。需要特别说明的是：隐性等待对整个 driver 的周期都起作用，所以只要设置一次即可
'''
# driver.implicitly_wait(0)
# # 访问页面
# driver.get("https://www.baidu.com/")
# # 设置搜索关键词
# element = driver.find_element_by_id("kw")
# element.send_keys("Selenium", Keys.ENTER)
# # 页面右边的"相关术语"
# element2 = driver.find_element_by_class_name("opr-recommends-merge-p")
# print(element2)

# 显式等待
'''
显式等待是对指定的元素进行等待。首先判定等待条件是否成立，如果成立，则直接返回；
如果条件不成立，则等待最长时间为设置的等待时间，如果超过等待时间后仍然没有满足等待条件，则抛出异常
'''
# from selenium import webdriver
# from selenium.webdriver.common.by import By
# from selenium.webdriver.common.keys import Keys
# from selenium.webdriver.support.ui import WebDriverWait
# from selenium.webdriver.support import expected_conditions as EC
# # 声明浏览器对象
# driver = webdriver.Chrome()
# # 访问页面
# driver.get("https://www.baidu.com/")
# # 设置搜索关键词
# element = driver.find_element_by_id("kw")
# element.send_keys("selenium", Keys.ENTER)
# # 此时页面右边的"相关术语"还没有加载出来，肯定会报错
# #element1 = driver.find_element_by_class_name("opr-recommends-merge-p")
# #print(element1)
# # 显示等待10秒，直到页面右边的"相关术语"出现
# WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "opr-recommends-merge-p")))
# # 获取页面右边的"相关术语"
# element2 = driver.find_element_by_class_name("opr-recommends-merge-p")
# print(element2)

# TODO 浏览器前进和后退
# from selenium import webdriver
# import time
# # 声明浏览器对象
# driver = webdriver.Chrome()
# # 访问百度
# driver.get("http://www.baidu.com")
# time.sleep(2)
# # 访问微博
# driver.get("https://weibo.com")
# time.sleep(2)
# # 访问知乎
# driver.get("http://www.zhihu.com")
# time.sleep(2)
# # 返回上个页面
# driver.back()
# time.sleep(2)
# # 前进到下个页面
# driver.forward()
# # 退出
# driver.close()

# TODO 操作 Cookie
# from selenium import webdriver
# # 声明浏览器对象
# driver = webdriver.Chrome()
# # 访问百度
# driver.get("http://www.baidu.com")
# # 获取当前的cookie
# print(driver.get_cookies())
# # 添加cookie
# driver.add_cookie({'name': 'mycookie', 'value': 'world'})
# # 获取设置的cookie
# print(driver.get_cookie('mycookie'))
# # 删除设置的cookie
# driver.delete_cookie('mycookie')
# # 再次获取设置的cookie
# print(driver.get_cookie('mycookie'))
# # 清除所有cookie
# driver.delete_all_cookies()
# # 再次获取cookie
# print(driver.get_cookies())
# # 退出
# driver.close()

'''
我们通过 add_cookie() 方法，来设置 cookie 的名称和值，
通过给 delete_cookie() 方法传递 cookie 的名称来删除 cookie，还可以通过 get_cookies() 和 delete_all_cookies() 来获取所有 cookie 以及删除所有 cookie
'''

# todo 标签管理
from selenium import webdriver
import time
# 声明浏览器对象
driver = webdriver.Chrome()
# 访问百度
driver.get("http://www.baidu.com")
time.sleep(2)
# 新增一个标签页
driver.execute_script('window.open()')
time.sleep(2)
# 打印标签页
print(driver.window_handles)
# 切换至标签页1（当前标签页为0）
driver.switch_to.window(driver.window_handles[1])
time.sleep(2)
# 在当前标签页访问知乎
driver.get("http://www.zhihu.com")
time.sleep(2)
# 切换至标签页0
driver.switch_to.window(driver.window_handles[0])
time.sleep(2)
# 在标签页0访问微博
driver.get("http://www.weibo.com")
time.sleep(2)
# 关闭
driver.close()
# 退出
driver.quit()
'''
上面例子 切换标签页和访问网页的变化，中间加了等待是为了延迟变化。另外，注意标签页从左往右是从0开始编号的
'''